/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.normalisation.services.impl;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Service;

import fr.generali.accueilclient.client.om.IAdresse;
import fr.generali.accueilclient.client.om.impl.AdressePostaleRetour;
import fr.generali.accueilclient.commun.exception.AccueilClientTechnicalException;
import fr.generali.accueilclient.normalisation.services.INormalisationAdresseService;
import fr.generali.accueilclient.utils.stringbuilder.StringBuilderUtils;
import fr.generali.refservcommuns.rce.autresreferentiels.normalisation.adresse.entree.DtoDemandeValidationAdressePostale;
import fr.generali.refservcommuns.rce.autresreferentiels.normalisation.adresse.retour.DtoAdressePostaleRetour;
import fr.generali.refservcommuns.rce.autresreferentiels.normalisation.adresse.services.IValidationAdresseService;
import fr.generali.refservcommuns.rce.autresreferentiels.normalisation.adresse.services.TechnicalFault;

/**
 * Implémentation de {@link INormalisationAdresseService}
 * 
 * @author selrhazala
 */
@Service
public class NormalisationAdresseService implements INormalisationAdresseService {

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(NormalisationAdresseService.class);

    /**
     * Service de propagation d'adresse
     */
    @Autowired
    @Qualifier("normalisationAdresse")
    private IValidationAdresseService webServiceNormAdr;
    
    /**
     * Assembleur de AdressePostaleRetour
     */
    @Autowired
    @Qualifier("dtoAdressePostaleRetourToAdressePostaleRetourConverter")
    private Converter<DtoAdressePostaleRetour, AdressePostaleRetour> dtoAdressePostaleRetourToAdressePostaleRetourConverter;
    
    /**
     * @param adresse l'adresse
     * @param nom le nom
     * @param prenom le prenom
     * @return adressePostaleRetour
     */
    public AdressePostaleRetour validerAdresse(IAdresse adresse, String nom, String prenom) {
        LOGGER.info("validerAdresse 1");
        AdressePostaleRetour adressePostaleRetour = null;
        try {
            DtoDemandeValidationAdressePostale dtoDemandeValidationAdressePostale =
                            new DtoDemandeValidationAdressePostale();
            dtoDemandeValidationAdressePostale.setLigne2(nom + StringBuilderUtils.SEPARATOR_ESPACE + prenom);
            dtoDemandeValidationAdressePostale.setLigne3(adresse.getPointRemise() + StringBuilderUtils.SEPARATOR_ESPACE
                            + adresse.getPointGeographique());
            dtoDemandeValidationAdressePostale.setLigne4(adresse.getVoie());
            dtoDemandeValidationAdressePostale.setLigne5(adresse.getBoitePostale());
            dtoDemandeValidationAdressePostale.setCodePostal(adresse.getCodePostal());
            dtoDemandeValidationAdressePostale.setLibelleLocalite(adresse.getVille());

            DtoAdressePostaleRetour dtoAdressePostaleRetour =
                            this.webServiceNormAdr.validerAdresse(dtoDemandeValidationAdressePostale);
            adressePostaleRetour =
                            dtoAdressePostaleRetourToAdressePostaleRetourConverter.convert(dtoAdressePostaleRetour);

        } catch (TechnicalFault e) {
            throw new AccueilClientTechnicalException(e.getMessage(), StringUtils.EMPTY, e);
        }

        return adressePostaleRetour;
    }

    /**
     * @param adresse l'adresse
     * @return adressePostaleRetour
     */
    public AdressePostaleRetour validerAdresse(IAdresse adresse) {
        LOGGER.info("validerAdresse 2");
        AdressePostaleRetour adressePostaleRetour = null;
        try {
            DtoDemandeValidationAdressePostale dtoDemandeValidationAdressePostale =
                            new DtoDemandeValidationAdressePostale();
            dtoDemandeValidationAdressePostale.setLigne3(adresse.getPointRemise() 
                            + StringBuilderUtils.SEPARATOR_ESPACE
                            + adresse.getPointGeographique());
            dtoDemandeValidationAdressePostale.setLigne4(adresse.getVoie());
            dtoDemandeValidationAdressePostale.setLigne5(adresse.getBoitePostale());
            dtoDemandeValidationAdressePostale.setCodePostal(adresse.getCodePostal());
            dtoDemandeValidationAdressePostale.setLibelleLocalite(adresse.getVille());

            DtoAdressePostaleRetour dtoAdressePostaleRetour =
                            this.webServiceNormAdr.validerAdresse(dtoDemandeValidationAdressePostale);
            adressePostaleRetour =
                            dtoAdressePostaleRetourToAdressePostaleRetourConverter.convert(dtoAdressePostaleRetour);

        } catch (TechnicalFault e) {
            throw new AccueilClientTechnicalException(e.getMessage(), StringUtils.EMPTY, e);
        }

        return adressePostaleRetour;
    }

    /**
     * @param codePostal le codePostal
     * @return adressePostaleRetour
     */
    public AdressePostaleRetour recupererVilles(String codePostal) {
        LOGGER.info("recupererVilles");
        AdressePostaleRetour adressePostaleRetour = null;
        try {
            DtoDemandeValidationAdressePostale dtoDemandeValidationAdressePostale =
                            new DtoDemandeValidationAdressePostale();
            dtoDemandeValidationAdressePostale.setCodePostal(codePostal);

            DtoAdressePostaleRetour dtoAdressePostaleRetour =
                            this.webServiceNormAdr.validerAdresse(dtoDemandeValidationAdressePostale);
            adressePostaleRetour =
                            dtoAdressePostaleRetourToAdressePostaleRetourConverter.convert(dtoAdressePostaleRetour);

        } catch (TechnicalFault e) {
            throw new AccueilClientTechnicalException(e.getMessage(), StringUtils.EMPTY, e);
        }

        return adressePostaleRetour;
    }
    
}
